//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Lambda
// 文件名   : Lambda.h
// 作者     : Aiye
// 日期     : 2025/8/16 01:38
// 邮箱     : 2878548868@qq.com
// 摘要     : 介绍lambda表达式的用法
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef LAMBDA_LAMBDA_H
#define LAMBDA_LAMBDA_H
#include <iostream>

/* Lambda */
class Lambda
{
public:
    /*
     * @brief 介绍Lambda的用法
     */
    Lambda()
    {
        auto func = [](int x , int y) -> int
        {
            return x + y;
        };
        std::cout << func(2,3) << std::endl;

        auto funt = [](auto x , auto y) -> decltype( x + y )
        {
            return x + y;
        };
        std::cout << funt(3,4.5) << std::endl; // lambda表达式不能显示声明类型
        std::cout << funt(std::string("Hello"), std::string("World")) << std::endl;

        // [] 不捕获任何外部变量
        auto funa = []()
        {
            std::cout << "不捕获外部任何变量" << std::endl;
        };

        // [=] 以值捕获所有外部变量
        auto funb = [=]()
        {
            std::cout << "以值捕获所有外部变量" << _nVar; // 拷贝的形式
            // nVar++; // 这里捕获是只读的
        };

        auto fund = [=]()mutable
        {
            std::cout << "以值捕获所有外部变量" << _nVar; // 拷贝的形式
            _nVar++; // 改变的是副本的变量
        };

        // 以引用的形式捕获
        auto fune = [&]() mutable
        {
            std::cout << "以引用的形式捕获外部变量" << std::endl;
            _nVar++; // 改变的是实际值
        };

        // 捕获this 指针
        auto funf = [this]() mutable
        {
            std::cout << "捕获this指针" << std::endl;
            this->_nVar++;
        };

        fund();
        fune();
        funf();
    }
private:
    int _nVar{3};
};
#endif //LAMBDA_LAMBDA_H